#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
       

#define  test  2

/*
    raise(int pid) 函数：向自己所在的进程发信号，不刷新缓冲到内核 ，例如raise(9)，杀死自己的进程
    测试1.在父进程中四循环
      子进程中自己暂停自己
      ps -axj 显示父进程是R+运行态，子进程是T+暂停态
    测试2.父进程调用waitpid()函数等待指定pid的进程终止或暂停
          第三个参数决定是否阻塞等待
          WNOHANG : 不阻塞，如果指定pid进程没有终止或暂停，则返回0，否则返回其进程号
          WUNTRACED : 进程挂起，直到等待的进程被终止或停止，返回被终止或停止的进程PID
*/
int main(int argc, char *argv[])
{
    printf("111");  //不会运行，因为raise函数不会将刷新缓冲，相当于_exit()

    // raise(9);  //杀死自己进程，如果是exit(),则上面的printf会执行
    // exit(0);   //退出进程，将缓存刷新

    #if test == 1
    //测试1
    pid_t pid;
    pid = fork();
    if(pid > 0){
        printf("我是父进程\n");
        // sleep(5);
        while(1);
    }
    if(pid == 0){
        printf("我是子进程\n");
        raise(SIGTSTP);  //暂停进程
    }

    #elif test == 2
    //测试1
    pid_t pid;
    pid = fork();
    if(pid > 0){
        printf("我是父进程\n");
        
        int res;
        //WNOHANG ： 如果pid指定的进程没有结束，则waitpid()函数立即返回0；如果结束了，则返回该进程的进程号。
        //WUNTRACED : 进程挂起，直到等待的进程被终止或停止，返回被终止或停止的进程PID
        res = waitpid(pid, NULL, WUNTRACED);
        printf("返回值 res = %d\n",res);
        
        while(1);
    }
    if(pid == 0){
        printf("我是子进程\n");
        sleep(2);
        raise(SIGTSTP);  //暂停进程
    }
    #endif

    printf("222\n");

    return 0;
}
